<!doctype html>
<html lang="zh-CN">
<head>
  <base href="https://www.nodeapp.cn/repl.html" />
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>交互式解释器（REPL） | Node.js 中文文档 | Node.js 中文网</title>
  <meta name="description" content="Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型，使其轻量又高效。Node.js 的包管理器 npm，是全球最大的开源库生态系统。">
  <link rel="stylesheet" href="assets/style.css">
  <link rel="stylesheet" href="assets/sh.css">
  <link rel="canonical" href="https://www.nodeapp.cn/repl.html">
  <link rel="apple-touch-icon" href="apple-touch-icon.png">
  <link rel="icon" sizes="32x32" type="image/png" href="favicon.png">
  
  <script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?acdf78480f7f8f2b23b812565a5868e0";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

</head>
<body class="alt apidoc" id="api-section-repl">
  <div id="content" class="clearfix">
    <div id="column1" data-id="repl" class="interior">
      <header>
        <h1>Node.js v8.x 中文文档</h1>
        <hr>
      </header>

      <div id="toc">
        <h2>目录</h2>
        <ul>
<li><span class="stability_2"><a href="#repl_repl">repl (交互式解释器)</a></span><ul>
<li><span class="stability_undefined"><a href="#repl_design_and_features">设计与特性</a></span><ul>
<li><span class="stability_undefined"><a href="#repl_commands_and_special_keys">命令与特殊键</a></span></li>
<li><span class="stability_undefined"><a href="#repl_default_evaluation">默认的解释器</a></span><ul>
<li><span class="stability_undefined"><a href="#repl_javascript_expressions">JavaScript 表达式</a></span></li>
<li><span class="stability_undefined"><a href="#repl_global_and_local_scope">全局作用域与局部作用域</a></span></li>
<li><span class="stability_undefined"><a href="#repl_accessing_core_node_js_modules">访问 Node.js 核心模块</a></span></li>
<li><span class="stability_undefined"><a href="#repl_assignment_of_the_underscore_variable"><code>_</code>（下划线）变量的赋值</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#repl_custom_evaluation_functions">自定义的解释函数</a></span><ul>
<li><span class="stability_undefined"><a href="#repl_recoverable_errors">可恢复的错误</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#repl_customizing_repl_output">自定义 REPL 输出</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#repl_class_replserver">REPLServer 类</a></span><ul>
<li><span class="stability_undefined"><a href="#repl_event_exit">&apos;exit&apos; 事件</a></span></li>
<li><span class="stability_undefined"><a href="#repl_event_reset">&apos;reset&apos; 事件</a></span></li>
<li><span class="stability_undefined"><a href="#repl_replserver_definecommand_keyword_cmd">replServer.defineCommand(keyword, cmd)</a></span></li>
<li><span class="stability_undefined"><a href="#repl_replserver_displayprompt_preservecursor">replServer.displayPrompt([preserveCursor])</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#repl_repl_start_options">repl.start([options])</a></span></li>
<li><span class="stability_undefined"><a href="#repl_the_node_js_repl">Node.js 的 REPL</a></span><ul>
<li><span class="stability_undefined"><a href="#repl_environment_variable_options">环境变量选项</a></span></li>
<li><span class="stability_undefined"><a href="#repl_persistent_history">历史记录</a></span><ul>
<li><span class="stability_0"><a href="#repl_node_repl_history_file">NODE_REPL_HISTORY_FILE</a></span></li>
</ul>
</li>
<li><span class="stability_undefined"><a href="#repl_using_the_node_js_repl_with_advanced_line_editors">在高级的行编辑器中使用 Node.js REPL</a></span></li>
<li><span class="stability_undefined"><a href="#repl_starting_multiple_repl_instances_against_a_single_running_instance">在一个 Node.js 实例中启动多个 REPL 实例</a></span></li>
</ul>
</li>
</ul>
</li>
</ul>

      </div>
<div id="apicontent">
        <h1>repl (交互式解释器)<span><a class="mark" href="#repl_repl" id="repl_repl">#</a></span></h1>
<!--introduced_in=v0.10.0-->
<div class="api_stability api_stability_2"><a href="documentation.html#documentation_stability_index">稳定性: 2</a> - 稳定的</div><p><code>repl</code> 模块提供了一种“读取-求值-输出”循环（REPL）的实现，它可作为一个独立的程序或嵌入到其他应用中。
可以通过以下方式使用它：</p>
<pre><code class="lang-js">const repl = require(&apos;repl&apos;);
</code></pre>
<h2>设计与特性<span><a class="mark" href="#repl_design_and_features" id="repl_design_and_features">#</a></span></h2>
<p><code>repl</code> 模块导出了 <code>repl.REPLServer</code> 类。
当 <code>repl.REPLServer</code> 实例运行时，它接收用户输入的每一行，根据用户定义的解释函数解释这些输入，然后输出结果。
输入可以是 <code>stdin</code>，输出可以是 <code>stdout</code>，或者也可以连接到其他任何 Node.js <a href="stream.html">流</a>。</p>
<p><code>repl.REPLServer</code> 实例支持输入的自动补全、精简 Emacs 风格的行编辑、多行输入、ANSI 风格的输出、当前 REPL 会话状态的保存与恢复、错误校正、以及可定制的解释函数。</p>
<h3>命令与特殊键<span><a class="mark" href="#repl_commands_and_special_keys" id="repl_commands_and_special_keys">#</a></span></h3>
<p>所有 REPL 的实例都支持下列特殊命令：</p>
<ul>
<li><code>.break</code> - 在输入一个多行表达式的过程中，输入 <code>.break</code> 命令（或按下 <code>&lt;ctrl&gt;-C</code> 组合键）将终止表达式的继续输入。</li>
<li><code>.clear</code> - 重置 REPL 的 <code>context</code> 为一个空对象，并清除当前正输入的所有多行表达式。</li>
<li><code>.exit</code> - 关闭输入输出流，退出 REPL。</li>
<li><code>.help</code> - 显示特定命令的帮助列表。</li>
<li><code>.save</code> - 保存当前 REPL 会话到一个文件：
<code>&gt; .save ./file/to/save.js</code></li>
<li><code>.load</code> - 读取一个文件到当前 REPL 会话。
<code>&gt; .load ./file/to/load.js</code></li>
<li><code>.editor</code> 进入编辑模式（<code>&lt;ctrl&gt;-D</code> 完成，<code>&lt;ctrl&gt;-C</code> 取消）</li>
</ul>
<!-- eslint-skip -->
<pre><code class="lang-js">&gt; .editor
// 进入编辑模式（^D 完成，^C 取消）
function welcome(name) {
  return `你好 ${name}！`;
}

welcome(&apos;Node.js 用户&apos;);

// ^D
&apos;你好 Node.js 用户！&apos;
&gt;
</code></pre>
<p>REPL 中下列按键组合有特殊作用：</p>
<ul>
<li><code>&lt;ctrl&gt;-C</code> - 当按下一次时，与 <code>.break</code> 命令的效果一样。当在空白行按下两次时，与 <code>.exit</code> 命令的效果一样。</li>
<li><code>&lt;ctrl&gt;-D</code> - 与 <code>.exit</code> 命令的效果一样。</li>
<li><code>&lt;tab&gt;</code> - 当在空白行按下时，显示全局和本地作用域内的变量。当在输入时按下，显示相关的自动补全选项。</li>
</ul>
<h3>默认的解释器<span><a class="mark" href="#repl_default_evaluation" id="repl_default_evaluation">#</a></span></h3>
<p>默认情况下，所有 <code>repl.REPLServer</code> 实例使用了一个解释函数，它可以解释 JavaScript 表达式、提供对 Node.js 内置模块的访问。
当 <code>repl.REPLServer</code> 实例被创建时可以传入一个替换的解释函数，覆盖其默认的功能。</p>
<h4>JavaScript 表达式<span><a class="mark" href="#repl_javascript_expressions" id="repl_javascript_expressions">#</a></span></h4>
<p>默认的解释器支持直接解释 JavaScript 表达式：</p>
<!-- eslint-skip -->
<pre><code class="lang-js">&gt; 1 + 1
2
&gt; const m = 2
undefined
&gt; m + 1
3
</code></pre>
<p>除非在块级作用域中或函数中，否则变量不管是隐式地声明还是使用 <code>const</code> 、 <code>let</code> 或 <code>var</code> 关键字声明，都是声明在全局作用域中。</p>
<h4>全局作用域与局部作用域<span><a class="mark" href="#repl_global_and_local_scope" id="repl_global_and_local_scope">#</a></span></h4>
<p>默认的解释器提供了获取存在于全局作用域中的任何变量的途径。
可以通过给每个 <code>REPLServer</code> 绑定的 <code>context</code> 对象指定变量，来显式地把变量暴露给 REPL。
例如：</p>
<pre><code class="lang-js">const repl = require(&apos;repl&apos;);
const msg = &apos;message&apos;;

repl.start(&apos;&gt; &apos;).context.m = msg;
</code></pre>
<p><code>context</code> 对象的属性表现为 REPL 中的局部变量：</p>
<!-- eslint-skip -->
<pre><code class="lang-js">$ node repl_test.js
&gt; m
&apos;message&apos;
</code></pre>
<p>默认情况下 <code>context</code> 的属性不是只读的。
要指定只读的全局变量，<code>context</code> 的属性必须使用 <code>Object.defineProperty()</code> 来定义:</p>
<pre><code class="lang-js">const repl = require(&apos;repl&apos;);
const msg = &apos;message&apos;;

const r = repl.start(&apos;&gt; &apos;);
Object.defineProperty(r.context, &apos;m&apos;, {
  configurable: false,
  enumerable: true,
  value: msg
});
</code></pre>
<h4>访问 Node.js 核心模块<span><a class="mark" href="#repl_accessing_core_node_js_modules" id="repl_accessing_core_node_js_modules">#</a></span></h4>
<p>默认的解释器会自动加载被调用的 Node.js 核心模块到 REPL 环境中。
例如，除非被声明为一个全局变量或一个有限范围的变量，否则输入 <code>fs</code> 会被解释为 <code>global.fs = require(&apos;fs&apos;)</code>。</p>
<!-- eslint-skip -->
<pre><code class="lang-js">&gt; fs.createReadStream(&apos;./some/file&apos;);
</code></pre>
<h4><code>_</code>（下划线）变量的赋值<span><a class="mark" href="#repl_assignment_of_the_underscore_variable" id="repl_assignment_of_the_underscore_variable">#</a></span></h4>
<p>默认的解释器会把最近一次解释的表达式的结果赋值给变量 <code>_</code> （下划线）。
显式地设置 <code>_</code> 为某个值能禁用该特性。</p>
<!-- eslint-skip -->
<pre><code class="lang-js">&gt; [ &apos;a&apos;, &apos;b&apos;, &apos;c&apos; ]
[ &apos;a&apos;, &apos;b&apos;, &apos;c&apos; ]
&gt; _.length
3
&gt; _ += 1
Expression assignment to _ now disabled.
4
&gt; 1 + 1
2
&gt; _
4
</code></pre>
<h3>自定义的解释函数<span><a class="mark" href="#repl_custom_evaluation_functions" id="repl_custom_evaluation_functions">#</a></span></h3>
<p>当创建一个新的 <code>repl.REPLServer</code> 时，可以提供一个自定义的解释函数。
这可以用于实现完全定制化的 REPL 应用。</p>
<p>例子，一个执行文本翻译的 REPL：</p>
<pre><code class="lang-js">const repl = require(&apos;repl&apos;);
const { Translator } = require(&apos;translator&apos;);

const myTranslator = new Translator(&apos;en&apos;, &apos;fr&apos;);

function myEval(cmd, context, filename, callback) {
  callback(null, myTranslator.translate(cmd));
}

repl.start({ prompt: &apos;&gt; &apos;, eval: myEval });
</code></pre>
<h4>可恢复的错误<span><a class="mark" href="#repl_recoverable_errors" id="repl_recoverable_errors">#</a></span></h4>
<p>当用户正在 REPL 中输入时，按下 <code>&lt;enter&gt;</code> 键会把当前行的输入发送到 <code>eval</code> 函数。
为了支持多行输入，<code>eval</code> 函数可以返回一个 <code>repl.Recoverable</code> 实例给提供的回调函数：</p>
<pre><code class="lang-js">function myEval(cmd, context, filename, callback) {
  let result;
  try {
    result = vm.runInThisContext(cmd);
  } catch (e) {
    if (isRecoverableError(e)) {
      return callback(new repl.Recoverable(e));
    }
  }
  callback(null, result);
}

function isRecoverableError(error) {
  if (error.name === &apos;SyntaxError&apos;) {
    return /^(Unexpected end of input|Unexpected token)/.test(error.message);
  }
  return false;
}
</code></pre>
<h3>自定义 REPL 输出<span><a class="mark" href="#repl_customizing_repl_output" id="repl_customizing_repl_output">#</a></span></h3>
<p>默认情况下，在把输出写入到提供的可写流（默认为 <code>process.stdout</code>）之前，<code>repl.REPLServer</code> 实例会使用 <a href="util.html#util_util_inspect_object_options"><code>util.inspect()</code></a> 方法对输出进行格式化。
使用 <code>util.inspect()</code> 方法时，<code>useColors</code> 选项可被指定是否在建立默认输出器时使用 ANSI 风格的代码给输出上色。</p>
<p>在构造时，通过在 <code>writer</code> 选项传入一个新的函数，可以完全地自定义一个 <code>repl.REPLServer</code> 实例的输出。
例子，把输入的任何文本转换为大写：</p>
<pre><code class="lang-js">const repl = require(&apos;repl&apos;);

const r = repl.start({ prompt: &apos;&gt; &apos;, eval: myEval, writer: myWriter });

function myEval(cmd, context, filename, callback) {
  callback(null, cmd);
}

function myWriter(output) {
  return output.toUpperCase();
}
</code></pre>
<h2>REPLServer 类<span><a class="mark" href="#repl_class_replserver" id="repl_class_replserver">#</a></span></h2>
<div class="api_metadata">
<span>新增于: v0.1.91</span>
</div><p><code>repl.REPLServer</code> 类继承自 <a href="readline.html#readline_class_interface"><code>readline.Interface</code></a> 类。
<code>repl.REPLServer</code> 的实例由 <code>repl.start()</code> 方法创建，不能直接使用 JavaScript 的 <code>new</code> 关键字创建。</p>
<h3>&apos;exit&apos; 事件<span><a class="mark" href="#repl_event_exit" id="repl_event_exit">#</a></span></h3>
<div class="api_metadata">
<span>新增于: v0.7.7</span>
</div><p>当接收到 <code>.exit</code> 命令、或按下两次 <code>&lt;ctrl&gt;-C</code> 发出 <code>SIGINT</code> 信号、或按下 <code>&lt;ctrl&gt;-D</code> 发出 <code>&apos;end&apos;</code> 信号而使 REPL 被退出时，触发 <code>&apos;exit&apos;</code> 事件。
监听器的回调函数被调用时不带任何参数。</p>
<pre><code class="lang-js">replServer.on(&apos;exit&apos;, () =&gt; {
  console.log(&apos;从 REPL 接收到 &quot;exit&quot; 事件！&apos;);
  process.exit();
});
</code></pre>
<h3>&apos;reset&apos; 事件<span><a class="mark" href="#repl_event_reset" id="repl_event_reset">#</a></span></h3>
<div class="api_metadata">
<span>新增于: v0.11.0</span>
</div><p>当 REPL 的上下文被重置时，触发 <code>&apos;reset&apos;</code> 事件。
每当接收到 <code>.clear</code> 命令时会触发该事件，除非 REPL 正在使用默认的解释器并且 <code>repl.REPLServer</code> 实例被创建时 <code>useGlobal</code> 选项被设为 <code>true</code>。
监听器的回调函数被调用时会带上 <code>context</code> 对象作为惟一的参数。</p>
<p>这主要被用于重新初始化 REPL 上下文，使之达到某些预定义的状态，如下面的例子：</p>
<pre><code class="lang-js">const repl = require(&apos;repl&apos;);

function initializeContext(context) {
  context.m = &apos;test&apos;;
}

const r = repl.start({ prompt: &apos;&gt; &apos; });
initializeContext(r.context);

r.on(&apos;reset&apos;, initializeContext);
</code></pre>
<p>当代码被执行时，全局的 <code>&apos;m&apos;</code> 变量可以被修改，但随后的 <code>.clear</code> 命令会把它重置回初始值：</p>
<!-- eslint-skip -->
<pre><code class="lang-js">$ ./node example.js
&gt; m
&apos;test&apos;
&gt; m = 1
1
&gt; m
1
&gt; .clear
Clearing context...
&gt; m
&apos;test&apos;
&gt;
</code></pre>
<h3>replServer.defineCommand(keyword, cmd)<span><a class="mark" href="#repl_replserver_definecommand_keyword_cmd" id="repl_replserver_definecommand_keyword_cmd">#</a></span></h3>
<div class="api_metadata">
<span>新增于: v0.3.0</span>
</div><ul>
<li><code>keyword</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 命令关键字（开头不带 <code>.</code> 字符）。</li>
<li><code>cmd</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&lt;Object&gt;</a> | 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="type">&lt;Function&gt;</a> 当命令被执行时调用的函数。</li>
</ul>
<p><code>replServer.defineCommand()</code> 方法用于添加新的前缀为 <code>.</code> 的命令到 REPL 实例。
这些命令通过输入一个 <code>.</code> 加 <code>keyword</code> 来调用。
<code>cmd</code> 可以是一个函数或一个具有以下属性的对象：</p>
<ul>
<li><code>help</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 当键入 <code>.help</code> 时显示的帮助说明（可选）。</li>
<li><code>action</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="type">&lt;Function&gt;</a> 要执行的函数，可接受一个字符串参数。</li>
</ul>
<p>例子，添加两个新命令到 REPL 实例：</p>
<pre><code class="lang-js">const repl = require(&apos;repl&apos;);

const replServer = repl.start({ prompt: &apos;&gt; &apos; });
replServer.defineCommand(&apos;sayhello&apos;, {
  help: &apos;打招呼&apos;,
  action(name) {
    this.lineParser.reset();
    this.bufferedCommand = &apos;&apos;;
    console.log(`你好，${name}！`);
    this.displayPrompt();
  }
});
replServer.defineCommand(&apos;saybye&apos;, function saybye() {
  console.log(&apos;再见！&apos;);
  this.close();
});
</code></pre>
<p>在 REPL 实例中使用新的命令：</p>
<pre><code class="lang-txt">&gt; .sayhello Node.js中文网
你好，Node.js中文网！
&gt; .saybye
再见！
</code></pre>
<h3>replServer.displayPrompt([preserveCursor])<span><a class="mark" href="#repl_replserver_displayprompt_preservecursor" id="repl_replserver_displayprompt_preservecursor">#</a></span></h3>
<div class="api_metadata">
<span>新增于: v0.1.91</span>
</div><ul>
<li><code>preserveCursor</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a></li>
</ul>
<p><code>replServer.displayPrompt()</code> 方法会让 REPL 实例做好用户输入的准备，打印配置的 <code>prompt</code> 到 <code>output</code> 中新的一行，然后返回 <code>input</code> 等待新的输入。</p>
<p>当正在键入多行输入时，会打印省略号而不是提示符。</p>
<p>当 <code>preserveCursor</code> 为 <code>true</code> 时，游标位置不会被复位到 <code>0</code>。</p>
<p><code>replServer.displayPrompt</code> 方法主要被使用 <code>replServer.defineCommand()</code> 方法注册的命令的 <code>action</code> 函数调用。</p>
<h2>repl.start([options])<span><a class="mark" href="#repl_repl_start_options" id="repl_repl_start_options">#</a></span></h2>
<div class="api_metadata">
<details class="changelog"><summary>版本历史</summary>
<table>
<tbody><tr><th>版本</th><th>变更</th></tr>
<tr><td>v5.8.0</td>
<td><p>The <code>options</code> parameter is optional now.</p>
</td></tr>
<tr><td>v0.1.91</td>
<td><p><span>新增于: v0.1.91</span></p>
</td></tr>
</tbody></table>
</details>
</div><ul>
<li><code>options</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object" class="type">&lt;Object&gt;</a> | 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a><ul>
<li><code>prompt</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type" class="type">&lt;string&gt;</a> 要显示的输入提示符。默认为 <code>&gt;</code>（末尾有一个空格）。</li>
<li><code>input</code> <span class="type">&lt;Readable&gt;</span> REPL 输入要被读取的可读流。默认为 <code>process.stdin</code>。</li>
<li><code>output</code> <span class="type">&lt;Writable&gt;</span> REPL 输出要被写入的可写流。默认为 <code>process.stdout</code>。</li>
<li><code>terminal</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a> 如果为 <code>true</code>，则指定 <code>output</code> 应被当作一个 TTY 终端，并且可以使用 ANSI/VT100 转义码写入。
默认值为初始化时 <code>output</code> 流的 <code>isTTY</code> 属性的值。</li>
<li><code>eval</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="type">&lt;Function&gt;</a> 当解释每行输入时使用的函数。默认为 JavaScript <code>eval()</code> 函数的异步封装。
<code>eval</code> 函数出错时会返回 <code>repl.Recoverable</code>，表明输入不完整并提示用户完成输入。</li>
<li><code>useColors</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a> 如果为 <code>true</code>，则指定默认的 <code>writer</code> 函数可以在 REPL 输出中包含 ANSI 颜色风格。
如果提供了自定义的 <code>writer</code> 函数，则该参数无效。
默认为 REPL 实例的 <code>terminal</code> 属性的值。</li>
<li><code>useGlobal</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a> 如果为 <code>true</code>，则指定默认的解释函数使用 JavaScript <code>global</code> 作为上下文，而不是为 REPL 实例创建一个新的独立的上下文。
在node命令行(node CLI)交互解释器中，这个值为 <code>true</code>.
默认为 <code>false</code>。</li>
<li><code>ignoreUndefined</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type" class="type">&lt;boolean&gt;</a> 如果为 <code>true</code>，则指定默认的输出器不会输出命令返回的 <code>undefined</code> 值。
 默认为 <code>false</code>。</li>
<li><code>writer</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="type">&lt;Function&gt;</a> 在写入到 <code>output</code> 之前，该函数被调用用来格式化每个命令的输出。
默认为 <a href="util.html#util_util_inspect_object_options"><code>util.inspect()</code></a>。</li>
<li><code>completer</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function" class="type">&lt;Function&gt;</a> 可选的函数，用来自定义 Tab 键的自动补全。
详见 <a href="readline.html#readline_use_of_the_completer_function"><code>readline.InterfaceCompleter</code></a>。</li>
<li><code>replMode</code> 
            <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Symbol_type" class="type">&lt;symbol&gt;</a> 一个标志位，指定默认的解释器使用严格模式或默认（sloppy）模式来执行 JavaScript 命令。
可选的值有：<ul>
<li><code>repl.REPL_MODE_SLOPPY</code> - 使用默认模式解释表达式。</li>
<li><code>repl.REPL_MODE_STRICT</code> - 使用严格模式解释表达式。该模式等同于在每个 repl 声明前加上 <code>&apos;use strict&apos;</code>。</li>
<li><code>repl.REPL_MODE_MAGIC</code> - This value is <strong>deprecated</strong>, since enhanced
spec compliance in V8 has rendered magic mode unnecessary. It is now
equivalent to <code>repl.REPL_MODE_SLOPPY</code> (documented above).</li>
</ul>
</li>
<li><code>breakEvalOnSigint</code> - 当接收到 <code>SIGINT</code> 时停止解释当前代码，比如按下 <code>Ctrl+C</code>。
不能与自定义的 <code>eval</code> 函数同时使用。
默认为 <code>false</code>。</li>
</ul>
</li>
</ul>
<p><code>repl.start()</code> 方法创建并启动一个 <code>repl.REPLServer</code> 实例。</p>
<p>如果 <code>options</code> 是一个字符串，则它指定了输入提示符：</p>
<pre><code class="lang-js">const repl = require(&apos;repl&apos;);

// 一个 Unix 风格的提示符
repl.start(&apos;$ &apos;);
</code></pre>
<h2>Node.js 的 REPL<span><a class="mark" href="#repl_the_node_js_repl" id="repl_the_node_js_repl">#</a></span></h2>
<p>Node.js 自身也使用 <code>repl</code> 模块为执行 JavaScript 代码提供交互接口。
可以通过不带任何参数（或使用 <code>-i</code> 参数）地执行 Node.js 二进制文件来使用它：</p>
<!-- eslint-skip -->
<pre><code class="lang-js">$ node
&gt; const a = [1, 2, 3];
undefined
&gt; a
[ 1, 2, 3 ]
&gt; a.forEach((v) =&gt; {
...   console.log(v);
...   });
1
2
3
</code></pre>
<h3>环境变量选项<span><a class="mark" href="#repl_environment_variable_options" id="repl_environment_variable_options">#</a></span></h3>
<p>使用以下环境变量，可以自定义 Node.js REPL 的各种行为：</p>
<ul>
<li><code>NODE_REPL_HISTORY</code> - 当给定了一个有效的路径，则 REPL 的历史记录将被保存到指定的文件，而不是用户目录下的 <code>.node_repl_history</code> 文件。
设为 <code>&quot;&quot;</code> 将禁用 REPL 历史记录。
值两头的空格键会被去掉。</li>
<li><code>NODE_REPL_HISTORY_SIZE</code> - 默认为 <code>1000</code>。控制历史记录的最大行数。必须是正数。</li>
<li><code>NODE_REPL_MODE</code> - 可以是 <code>sloppy</code>、<code>strict</code> 或 <code>magic</code>。
默认是<code>sloppy</code>, 在<code>sloppy</code>模式下，允许代码在非严格模式下运行. <code>magic</code>模式已经被弃用，且被视为<code>sloppy</code>模式运行.</li>
</ul>
<h3>历史记录<span><a class="mark" href="#repl_persistent_history" id="repl_persistent_history">#</a></span></h3>
<p>默认情况下，Node.js REPL 模块会把 <code>node</code> REPL 会话之间的历史记录保存到用户目录中的 <code>.node_repl_history</code> 文件。
修改环境变量 <code>NODE_REPL_HISTORY=&quot;&quot;</code> 可以禁用该功能。</p>
<h4>NODE_REPL_HISTORY_FILE<span><a class="mark" href="#repl_node_repl_history_file" id="repl_node_repl_history_file">#</a></span></h4>
<div class="api_metadata">
<span>新增于: v2.0.0</span><span>废弃于: v3.0.0</span>
</div><div class="api_stability api_stability_0"><a href="documentation.html#documentation_stability_index">稳定性: 0</a> - 废弃的: 使用 <a href="#repl_environment_variable_options">NODE_REPL_HISTORY</a> 代替。</div><p>Node.js/io.js v2.x 之前，REPL 的历史记录使用 <code>NODE_REPL_HISTORY_FILE</code> 变量来控制，且历史记录以 JSON 格式保存。
该变量已被废弃，旧的 JSON 格式的 REPL 历史记录文件会被自动转换为一种精简的纯文本格式。
这个新的文件会被保存到用户目录下或由 <code>NODE_REPL_HISTORY</code> 变量定义的目录下，详见<a href="#repl_environment_variable_options">环境变量选项</a>。</p>
<h3>在高级的行编辑器中使用 Node.js REPL<span><a class="mark" href="#repl_using_the_node_js_repl_with_advanced_line_editors" id="repl_using_the_node_js_repl_with_advanced_line_editors">#</a></span></h3>
<p>对于高级的行编辑器，可以使用环境变量 <code>NODE_NO_READLINE=1</code> 来启动 Node.js。
这会以标准的终端配置来启动主 REPL 和调试 REPL，可以使用 <code>rlwrap</code>。</p>
<p>例如，可以在 <code>.bashrc</code> 文件中添加：</p>
<pre><code class="lang-text">alias node=&quot;env NODE_NO_READLINE=1 rlwrap node&quot;
</code></pre>
<h3>在一个 Node.js 实例中启动多个 REPL 实例<span><a class="mark" href="#repl_starting_multiple_repl_instances_against_a_single_running_instance" id="repl_starting_multiple_repl_instances_against_a_single_running_instance">#</a></span></h3>
<p>可以在一个 Node.js 实例中创建并运行多个 REPL 实例，它们共享一个 <code>global</code> 对象但有独立的 I/O 接口。</p>
<p>例子，在 <code>stdin</code>、Unix socket、和 TCP socket 上分别提供了独立的 REPL：</p>
<pre><code class="lang-js">const net = require(&apos;net&apos;);
const repl = require(&apos;repl&apos;);
let connections = 0;

repl.start({
  prompt: &apos;Node.js 使用 stdin&gt; &apos;,
  input: process.stdin,
  output: process.stdout
});

net.createServer((socket) =&gt; {
  connections += 1;
  repl.start({
    prompt: &apos;Node.js 使用 Unix socket&gt; &apos;,
    input: socket,
    output: socket
  }).on(&apos;exit&apos;, () =&gt; {
    socket.end();
  });
}).listen(&apos;/tmp/node-repl-sock&apos;);

net.createServer((socket) =&gt; {
  connections += 1;
  repl.start({
    prompt: &apos;Node.js 使用 TCP socket&gt; &apos;,
    input: socket,
    output: socket
  }).on(&apos;exit&apos;, () =&gt; {
    socket.end();
  });
}).listen(5001);
</code></pre>
<p>从命令行运行这个应用会在 stdin 上启动一个 REPL。
其他 REPL 客户端可以通过 Unix socket 或 TCP socket 进行连接。
例如，可以使用 <code>telnet</code> 连接到 TCP socket，使用 <code>socat</code> 连接到 Unix socket 或 TCP socket。</p>
<p>通过从一个基于 Unix socket 的服务器（而不是 stdin）启动一个 REPL，可以连接到一个长期运行的 Node.js 进程而无需重启它。</p>
<p>例子，在一个 <code>net.Server</code> 实例和一个 <code>net.Socket</code> 实例上运行一个全特性的（<code>terminal</code>）REPL，详见：<a href="https://gist.github.com/2209310">https://gist.github.com/2209310</a></p>
<p>例子，在 <a href="https://curl.haxx.se/docs/manpage.html">curl(1)</a> 上运行一个 REPL 实例，详见：<a href="https://gist.github.com/2053342">https://gist.github.com/2053342</a></p>

      </div>
    </div>

    <div id="column2" class="interior">
      <div id="intro" class="interior">
        <a href="/" title="Go back to the home page">
          Node.js 中文文档 | Node.js 中文网
        </a>
      </div>
      
        <!-- [start-include:_toc.md] -->
<ul>
<li><a href="documentation.html">关于本文档</a></li>
<li><a href="synopsis.html">用法与例子</a></li>
</ul>
<div class="line"></div>

<ul>
<li><a href="assert.html">断言测试</a></li>
<li><a href="async_hooks.html">异步钩子（Async Hooks）</a></li>
<li><a href="buffer.html">缓存（Buffer）</a></li>
<li><a href="addons.html">C++ 插件</a></li>
<li><a href="n-api.html">C/C++ 插件 - N-API</a></li>
<li><a href="child_process.html">子进程</a></li>
<li><a href="cluster.html">集群（Cluster）</a></li>
<li><a href="cli.html">命令行参数</a></li>
<li><a href="console.html">控制台（Console）</a></li>
<li><a href="crypto.html">加密（Crypto）</a></li>
<li><a href="debugger.html">调试器</a></li>
<li><a href="deprecations.html">废弃的 API</a></li>
<li><a href="dns.html">DNS</a></li>
<li><a href="domain.html">域（Domain）</a></li>
<li><a href="esm.html">ECMAScript 模块</a></li>
<li><a href="errors.html">错误（Errors）</a></li>
<li><a href="events.html">事件（Events）</a></li>
<li><a href="fs.html">文件系统</a></li>
<li><a href="globals.html">全局对象（Globals）</a></li>
<li><a href="http.html">HTTP</a></li>
<li><a href="http2.html">HTTP/2</a></li>
<li><a href="https.html">HTTPS</a></li>
<li><a href="inspector.html">检查工具（Inspector）</a></li>
<li><a href="intl.html">国际化</a></li>
<li><a href="modules.html">模块（Modules）</a></li>
<li><a href="net.html">网络（Net）</a></li>
<li><a href="os.html">操作系统（OS）</a></li>
<li><a href="path.html">路径（Path）</a></li>
<li><a href="perf_hooks.html">性能钩子（Performance Hooks）</a></li>
<li><a href="process.html">进程</a></li>
<li><a href="punycode.html">Punycode</a></li>
<li><a href="querystring.html">查询字符串</a></li>
<li><a href="readline.html">逐行读取</a></li>
<li><a href="repl.html">交互式解释器（REPL）</a></li>
<li><a href="stream.html">流（Stream）</a></li>
<li><a href="string_decoder.html">字符串解码</a></li>
<li><a href="timers.html">定时器（Timers）</a></li>
<li><a href="tls.html">安全传输层（TLS/SSL）</a></li>
<li><a href="tracing.html">事件跟踪（Tracing）</a></li>
<li><a href="tty.html">TTY</a></li>
<li><a href="dgram.html">UDP / 数据报</a></li>
<li><a href="url.html">URL</a></li>
<li><a href="util.html">工具集</a></li>
<li><a href="v8.html">V8</a></li>
<li><a href="vm.html">虚拟机（VM）</a></li>
<li><a href="zlib.html">压缩（ZLIB）</a></li>
</ul>
<div class="line"></div>

<ul>
<li><a href="https://github.com/nodejs/node">GitHub 仓库和问题跟踪</a></li>
<li><a href="https://groups.google.com/group/nodejs">邮件列表</a></li>
</ul>
<!-- [end-include:_toc.md] -->

      
    </div>
  </div>
  <script src="assets/sh_main.js"></script>
  <script src="assets/sh_javascript.min.js"></script>
  <script>highlight(undefined, undefined, 'pre');</script>
</body>
</html>
